package com.atguigu.doubles.linklist;

import com.atguigu.doubles.DoubleNode;

/**
 * @ClassName DoubleLinkList
 * @DeScription 双向链表主类
 * @Author 剧情再美终是戏
 * @Date 2019/11/20 20:01
 * @Version 1.0
 **/
public class DoubleLinkList {

    // 初始化一个头节点
    DoubleNode head = new DoubleNode(0, "", "");

    // 尾部添加
    public void add(DoubleNode doubleNode) {

        // 找到最后一个节点
        DoubleNode tmp = head;
        for (; ; ) {
            DoubleNode next = tmp.getNext();
            if (null == next) {
                break;
            }
            tmp = next;
        }

        // 绑定双向链表的关系
        tmp.setNext(doubleNode);
        doubleNode.setPre(tmp);
    }

    // 有序添加
    public void addByOrder(DoubleNode doubleNode) {

        // 找到合适的位置添加
        DoubleNode tmp = head;
        for (; ; ) {
            DoubleNode next = tmp.getNext();
            if (null == next) {
                break;
            }
            if (doubleNode.getId() < next.getId()) {
                break;
            }
            tmp = next; // 后移下一个节点
        }

        // 绑定双向链表的关系
        // --> -->
        doubleNode.setNext(tmp.getNext());
        tmp.setNext(doubleNode);
        // <-- <--
        DoubleNode next = doubleNode.getNext();
        if (null != next) {  // 如果下一个节点为空了，那么下一个节点的上一个节点就不用设置了
            next.setPre(doubleNode);
        }
        doubleNode.setPre(tmp);
    }

    // 修改
    public void update(DoubleNode doubleNode) {

        // 判断是否为空
        DoubleNode tmp = head.getNext();
        if (null == tmp) {
            System.out.println("链表为空");
            return;
        }

        // 添加标记位
        boolean flag = false;

        // 循环每一个节点，找到这个节点就将标记位设置为true
        while (null != tmp) {
            if (doubleNode.getId() == tmp.getId()) {
                flag = true;
                break;
            }
            tmp = tmp.getNext(); // 后移下一个节点
        }

        // 修改这个节点的值
        if (flag) {
            tmp.setName(doubleNode.getName());
            tmp.setDes(doubleNode.getDes());
        } else {
            System.out.printf("链表中没有id=d%这个节点，修改失败\n", doubleNode.getId());
        }
    }

    // 删除
    public void del(int id) {

        // 判断是否为空
        DoubleNode tmp = head.getNext();
        if (null == tmp) {
            System.out.println("链表为空");
            return;
        }

        // 添加标记位
        boolean flag = false;

        // 循环每一个节点，找到这个节点就将标记位设置为true
        while (null != tmp) {
            if (id == tmp.getId()) {
                flag = true;
                break;
            }
            tmp = tmp.getNext(); // 后移下一个节点
        }
        // 删除这个节点
        if (flag) {
            tmp.getPre().setNext(tmp.getNext());
            DoubleNode next = tmp.getNext();
            if (null != next) { // 如果下一个节点为空了，那么下一个节点的上一个节点就不用设置了
                next.setPre(tmp.getPre());
            }
        } else {
            System.out.printf("链表中没有id=d%这个节点，删除失败\n", id);
        }
    }

    // 输出
    public void list() {

        // 判断是否为空
        DoubleNode tmp = head.getNext();
        if (null == tmp) {
            System.out.println("链表为空");
            return;
        }

        while (null != tmp) {
            System.out.println(tmp);
            tmp = tmp.getNext();
        }
    }
}
